const { PostModel, UserModel } = require('../../models/index')
const { Op } = require('sequelize')

// 获取攻略总数
const getPostCount = async (req, res) => {
  try {
    const postCountValue = await PostModel.count()

    // 统计成功返回响应
    res.status(200).json({
      title: '攻略总数',
      data: postCountValue
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 获取攻略列表数据
const getPostList = async (req, res) => {
  try {
    // 获取页码和每页大小
    const { type } = req.query

    // 从分页中间件中获取分页信息
    const { offset, pageSize } = req.pagination;

    if (!type) {
      return res.status(400).json({
        error: '查询类型不能为空！'
      })
    }

    const postData = await PostModel.findAndCountAll({
      attributes: ['post_id', 'title', 'images', 'type', 'is_hot', 'createdAt'],
      include: [
        {
          model: UserModel,
          as: 'post_belongsUser',
          attributes: ['username', 'avatar', 'phone']
        }
      ],
      where: {
        type: type
      },
      order: [
        ['updatedAt', 'DESC'],
        ['createdAt', 'DESC']
      ],
      offset: offset,
      limit: parseInt(pageSize, 10)
    })

    // 将数据转化为前端期望的格式
    const formData = {
      count: postData.count,
      rows: postData.rows.map(item => {
        return {
          id: item.post_id,
          title: item.title,
          image: item.images.map((item) => item.url),
          is_hot: item.is_hot,
          createdAt: item.createdAt,
          username: item.post_belongsUser.username,
          avatar: item.post_belongsUser.avatar,
          phone: item.post_belongsUser.phone
        }
      })
    }

    // 统计成功返回响应
    res.status(200).json({
      title: '攻略列表数据',
      data: formData
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 攻略列表搜索功能
const searchPost = async (req, res) => {
  try {
    // 获取用户输入的搜索词
    const searchText = req.query.data

    // 如果搜索词为空返回空数组
    if (!searchText || searchText.trim() === '') {
      return res.status(200).json([])
    }

    // 搜索匹配内容
    const postItem = await PostModel.findAll({
      include: [
        {
          model: UserModel,
          as: 'post_belongsUser',
          attributes: ['username', 'avatar', 'phone']
        }
      ],
      where: {
        [Op.or]: [
          { title: { [Op.like]: `%${searchText}%` } },
          { content: { [Op.like]: `%${searchText}%` } },
          { createdAt: { [Op.like]: `%${searchText}%` } },
          { '$post_belongsUser.username$': { [Op.like]: `%${searchText}%` } },
          { '$post_belongsUser.phone$': { [Op.like]: `%${searchText}%` } }
        ]
      }
    })

    // 将数据转化为前端期望的格式
    const formData = postItem.map(item => {
      return {
        id: item.post_id,
        title: item.title,
        image: item.images.map((item) => item.url),
        is_hot: item.is_hot,
        createdAt: item.createdAt,
        username: item.post_belongsUser.username,
        avatar: item.post_belongsUser.avatar,
        phone: item.post_belongsUser.phone
      }
    })

    // 返回查询结果
    return res.status(200).json({
      title: '搜索成功',
      data: formData
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 攻略热门状态切换
const toggleHotPost = async (req, res) => {
  try {
    // 获取攻略ID
    const id = req.params.id

    if (!id) {
      return res.status(400).json({ error: '攻略ID不能为空！' })
    }

    const hotPost = await PostModel.findByPk(id)

    // 攻略不存在的情况
    if (!hotPost) {
      return res.status(400).json({ error: '攻略不存在！' })
    }

    // 切换攻略热门状态
    await hotPost.update({ is_hot: !hotPost.is_hot })

    // 返回成功响应
    res.status(200).json({
      title: '切换成功',
      message: '攻略热门状态切换成功！'
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 删除攻略
const deletePost = async (req, res) => {
  try {
    // 获取攻略ID
    const id = req.params.id

    const result = await PostModel.destroy({
      where: {
        post_id: id
      }
    })

    // 检查是否有记录被删除
    if (result === 0) {
      return res.status(404).json({ error: '没有找到需要删除的攻略记录！' })
    }

    // 删除成功后返回响应
    res.status(200).json({
      title: '删除成功',
      message: '攻略记录已被成功删除!',
      data: result
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

module.exports = {
  getPostCount,
  getPostList,
  searchPost,
  toggleHotPost,
  deletePost
}
